﻿#region Copyright Notice
// This file is part of GestionPedago.
// <description>
// Copyright (C) 2012 ENI Ecole Informatique
// 
// GestionPedago is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// <program> is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using GestionPedago.Services.ES.Modele;
using GestionPedago.Services;
using GestionPedago.Services.ES;
using System.Windows.Input;
using GestionPedago.EntityContext;
using System.Windows;

namespace GestionPedago.ViewModel {

    /// <summary>
    /// Onglet de création/modification/suppression d'un évènement pédagogique
    /// </summary>
    public class CreaModEvenementPedagogiqueVM : OngletVM {

        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="parent"></param>
        public CreaModEvenementPedagogiqueVM(GestionnaireOngletsVM parent) {
            base.DisplayName = "Création/Modification évènement pédagogique";
            base.Parent = parent;
        }

        private ICommand creerEvenementCommand;
        private ICommand supprEvenementCommand;

        private string codeTypeEvenement;
        private string libelleEvenement;
        private int? codeContactGestionnaire;
        private int? codeContact;

        public string LibelleBouton {
            get {
                if(this.currentEvenement == null) {
                    return "Ajouter";
                }
                return "Enregistrer";
            }
        }
        /// <summary>
        /// L'évènement courant
        /// </summary>
        private EvenementPedagogiqueES currentEvenement;
        public EvenementPedagogiqueES CurrentEvenement {
            get {
                return this.currentEvenement;
            }
            set {
                this.currentEvenement = value;
                if(this.currentEvenement != null) {
                    this.CodeContactGestionnaire = this.currentEvenement.CodeDestinataire;
                    this.CodeEntreprise = this.currentEvenement.CodeEntreprise;
                    this.CodeTypeEvenement = this.currentEvenement.CodeTypeEvenement;
                    this.CodeContact = this.currentEvenement.CodeContactEntreprise;
                    this.Commentaire = this.currentEvenement.Commentaire;
                    if(this.currentEvenement.Alerte != null) {
                        this.DateEcheance = this.currentEvenement.Alerte.Echeance;
                        this.DateRappel = this.currentEvenement.Alerte.DateAlerte;
                    }
                    this.LibelleEvenement = this.currentEvenement.Libelle;
                }
            }
        }

        private List<TypeEvenementES> listeTypeEvenement;

        private List<ContactENIES> listeContactENI;

        private ObservableCollection<EntrepriseES> listeEntreprises;

        private ObservableCollection<ContactES> listeContact;

        private int? codeEntreprise;

        private DateTime? dateEcheance;

        private DateTime? dateRappel;

        private String commentaire;

        public ICommand CreerEvenementCommand {
            get {
                if(this.creerEvenementCommand == null) {
                    this.creerEvenementCommand = new RelayCommand(param => this.CreerEvenement());
                }
                return creerEvenementCommand;
            }
        }

        public ICommand SupprEvenementCommand {
            get {
                if(supprEvenementCommand == null) {
                    this.supprEvenementCommand = new RelayCommand(param => this.SupprimerEvenement());
                }
                return supprEvenementCommand;
            }
        }

        public String Commentaire {
            get {
                if(commentaire == null) {
                    return "<Saisir le commentaire>";
                }
                return commentaire;
            }
            set {
                commentaire = value;
                RaisePropertyChanged("Commentaire");
            }
        }

        public string Stagiaire {
            get {
                if(this.Parent.vmMainWindow.CurrentStagiaire.CodeStagiaire != 0) {
                    return this.Parent.vmMainWindow.CurrentStagiaire.Prenom + " " + this.Parent.vmMainWindow.CurrentStagiaire.Nom;
                }
                return "Veuillez sélectionner un stagiaire";
            }
        }

        public string CodeTypeEvenement {
            get {
                return codeTypeEvenement;
            }
            set {
                codeTypeEvenement = value;
                RaisePropertyChanged("CodeTypeEvenement");
            }
        }
        public string LibelleEvenement {
            get {
                return libelleEvenement;
            }
            set {
                libelleEvenement = value;
                RaisePropertyChanged("LibelleEvenement");
            }
        }


        public int? CodeContactGestionnaire {
            get {
                return codeContactGestionnaire;
            }
            set {
                codeContactGestionnaire = value;
                RaisePropertyChanged("CodeContactGestionnaire");
            }
        }

        public int? CodeEntreprise {

            get {
                return codeEntreprise;
            }

            set {
                codeEntreprise = value;
                RaisePropertyChanged("CodeEntreprise");
                updateListeContact();
            }

        }

        public int? CodeContact {
            get {
                return codeContact;
            }
            set {
                codeContact = value;
                RaisePropertyChanged("CodeContact");
            }
        }

        public DateTime? DateEcheance {
            get {
                return dateEcheance;
            }
            set {
                dateEcheance = value;
                RaisePropertyChanged("DateEcheance");
            }
        }

        public DateTime? DateRappel {
            get {
                return dateRappel;
            }
            set {
                dateRappel = value;
                RaisePropertyChanged("DateRappel");
            }
        }

        public List<EntrepriseES> Entreprises {
            get { return FacadeServices.GetInstance().RecupererEntreprises(new RecupererEntreprisesIn("")).ListeEntreprises; }
        }

        public EntrepriseES Entreprise { get; set; }

        public List<TypeEvenementES> ListeTypeEvenement {
            get {
                if(listeTypeEvenement == null) {
                    RecupererListeTypeEvenementOut recupererListeTypeEvenementOut =
                        FacadeServices.GetInstance().RecupererListeTypeEvenement(new RecupererListeTypeEvenementIn());
                    listeTypeEvenement = recupererListeTypeEvenementOut.ListeTypeEvenement;

                }
                return listeTypeEvenement;
            }

            set {
                listeTypeEvenement = value;
            }
        }

        public List<ContactENIES> ListeContactENI {

            get {
                if(listeContactENI == null) {
                    listeContactENI = FacadeServices.GetInstance().RechercherListeIntervenants(new RechercherListeIntervenantsIn()).ListeIntervenants;
                }

                return listeContactENI;
            }

            set {
                listeContactENI = value;
            }
        }

        public ObservableCollection<EntrepriseES> ListeEntreprises {
            get {
                if(listeEntreprises == null) {
                    listeEntreprises = new ObservableCollection<EntrepriseES>();
                    for(int i = 0; i < 10; i++) {
                        EntrepriseES entr = new EntrepriseES();
                        entr.RaisonSociale = "Entreprise " + (i + 1);
                        entr.CodeEntreprise = i;
                        listeEntreprises.Add(entr);
                    }
                }
                return listeEntreprises;
            }

            set {
                listeEntreprises = value;
                RaisePropertyChanged("ListeEntreprise");
            }
        }

        public ObservableCollection<ContactES> ListeContact {
            get {
                if(listeContact == null) {
                    updateListeContact();
                }
                return listeContact;
            }

            set {
                listeContact = value;
                RaisePropertyChanged("ListeContact");
            }
        }

        /// <summary>
        /// Méthode de mise à jour de la liste des contacts
        /// </summary>
        private void updateListeContact() {
            ObservableCollection<ContactES> contacts = new ObservableCollection<ContactES>();
            RecupererListeContactIn paramEntree = new RecupererListeContactIn();
            paramEntree.CodeEntreprise = codeEntreprise;
            List<ContactES> listeContactES = FacadeServices.GetInstance().RecupererListeContact(paramEntree).ListeContact;
            foreach(ContactES contact in listeContactES) {
                contacts.Add(contact);
            }
            ListeContact = contacts;
        }

        /// <summary>
        /// Méthode de création d'un évènement
        /// </summary>
        private void CreerEvenement() {
            if(this.CodeTypeEvenement == null || this.CodeContactGestionnaire == null) {
                MessageBox.Show("Veuillez séléctionner au minium un type d'évènement et un gestionnaire", "Information", MessageBoxButton.OK, MessageBoxImage.Information);
            } else {
                EvenementPedagogiqueES evenement = new EvenementPedagogiqueES();
                if(this.currentEvenement != null) {
                    evenement = this.currentEvenement;
                }

                bool alerteCreee = false;
                if(evenement.Alerte == null && this.DateRappel != null) {
                    if(this.DateEcheance == null) {
                        MessageBox.Show("Si vous renseigné une date d'alerte, vous devez également renseigner une échéance.", "Information", MessageBoxButton.OK, MessageBoxImage.Information);
                        return;
                    } else {
                        alerteCreee = true;
                    }
                }

                evenement.CodeDestinataire = this.CodeContactGestionnaire;
                evenement.CodeContactEntreprise = this.CodeContact;
                evenement.CodeEntreprise = this.CodeEntreprise;
                bool nouvelEvenement = true;
                if(evenement.IdEvenementPedagogique != 0) {
                    nouvelEvenement = false;
                }
                if(this.Parent.vmMainWindow.CurrentStagiaire.CodeStagiaire != 0) {
                    evenement.CodeStagiaire = this.Parent.vmMainWindow.CurrentStagiaire.CodeStagiaire;
                    evenement.Stagiaire = this.Parent.vmMainWindow.CurrentStagiaire;
                }
                evenement.CodeTypeEvenement = this.CodeTypeEvenement;
                evenement.Libelle = this.LibelleEvenement;
                evenement.Commentaire = this.Commentaire;
                evenement.DateEvenement = DateTime.Today;

                EnregistrerEvenementIn paramEntree = new EnregistrerEvenementIn();
                paramEntree.Evenement = evenement;
                paramEntree.DateEcheance = this.DateEcheance;
                paramEntree.DateRappel = this.DateRappel;

                this.currentEvenement = FacadeServices.GetInstance().EnregistrerEvenement(paramEntree).EvenementPedagogique;

                this.Parent.vmMainWindow.vmCartoucheStagiaire.UpdateListeEvenement(paramEntree.Evenement.Stagiaire);

                string message = null;
                if(nouvelEvenement) {
                    message = "L'évènement a été créé avec succès.";
                } else {
                    message = "L'évènement a été modifié avec succès.";
                }

                // Mise à jour des listes d'évènements et alertes
                foreach(OngletVM onglet in this.Parent.Onglets) {
                    if(onglet is EvenementsPedagogiquesVM) {
                        ((EvenementsPedagogiquesVM)onglet).UpdateListeEvenements();
                    }
                    if(onglet is AfficherAlertesVM) {
                        ((AfficherAlertesVM)onglet).UpdateAlertes();
                    }
                }

                Parent.vmMainWindow.vmBarreInfos.Message = message;

                if(alerteCreee) {
                    MessageBox.Show("Une alerte a été créée", "Information", MessageBoxButton.OK, MessageBoxImage.Information);
                }
            }
        }

        /// <summary>
        /// Méthode de suppression d'un évènement
        /// </summary>
        private void SupprimerEvenement() {
            MessageBoxResult result = MessageBox.Show("Etes-vous sûr de vouloir supprimer cet évènement ?", "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Question);
            if(System.Windows.MessageBoxResult.Yes.Equals(result)) {
                if(this.currentEvenement != null) {
                    SupprimerEvenementIn paramEntree = new SupprimerEvenementIn();
                    paramEntree.IdEvenementPedagogique = this.currentEvenement.IdEvenementPedagogique;
                    FacadeServices.GetInstance().SupprimerEvenement(paramEntree);
                }
                if(this.Parent.vmMainWindow.CurrentStagiaire.CodeStagiaire != 0) {
                    this.Parent.vmMainWindow.vmCartoucheStagiaire.UpdateListeEvenement(this.Parent.vmMainWindow.CurrentStagiaire);
                    this.Parent.CloseTab(this);
                }

                // Mise à jour des listes d'évènement et d'alertes
                foreach(OngletVM onglet in this.Parent.Onglets) {
                    if(onglet is EvenementsPedagogiquesVM) {
                        ((EvenementsPedagogiquesVM)onglet).UpdateListeEvenements();
                    }
                    if(onglet is AfficherAlertesVM) {
                        ((AfficherAlertesVM)onglet).UpdateAlertes();
                    }
                }
                Parent.vmMainWindow.vmBarreInfos.Message = "L'évènement a été supprimé.";
            }
        }
    }
}
